#ifndef __USART_H
#define __USART_H

#include <stm32f4xx.h>
#include <stdio.h>
#include <stdarg.h>
#include "delay.h"

/*定义串口接收缓冲区大小*/
#define USART1_BUF_RCV_MAX_SIZE 100
#define USART2_BUF_RCV_MAX_SIZE 100
#define USART3_BUF_RCV_MAX_SIZE 100

/*定义串口缓冲区接收结束符*/
#define USART1_BUF_RCV_CHAR '\n'
#define USART2_BUF_RCV_CHAR '\n'
#define USART3_BUF_RCV_CHAR '\n'

/*定义串口输出缓冲区大小*/
#define USART1_BUF_SEND_MAX_SIZE 100
#define USART2_BUF_SEND_MAX_SIZE 100
#define USART3_BUF_SEND_MAX_SIZE 100

/*各串口调试宏*/
#define USART_SEND_RCV_PRINT 0 // 总开关
#define USART1_DEBUG(s)       \
    if (0) \
    print_ln(s)
#define USART2_DEBUG(s)       \
    if (0) \
    print_ln(s)
#define USART3_DEBUG(s)       \
    if (0) \
    print_ln(s)

extern volatile uint8_t g_usart1_flag;                             //接收完毕标志位（0:未接收	1:已接收）
extern volatile uint8_t g_usart1_buf[USART1_BUF_RCV_MAX_SIZE + 1]; //接收数据
extern volatile uint8_t g_usart1_index;                            //接收数据下标

extern volatile uint8_t g_usart2_flag;                             //接收完毕标志位（0:未接收	1:已接收）
extern volatile uint8_t g_usart2_buf[USART2_BUF_RCV_MAX_SIZE + 1]; //接收数据
extern volatile uint8_t g_usart2_index;                            //接收数据下标

extern volatile uint8_t g_usart3_flag;                             //接收完毕标志位（0:未接收	1:已接收）
extern volatile uint8_t g_usart3_buf[USART3_BUF_RCV_MAX_SIZE + 1]; //接收数据
extern volatile uint8_t g_usart3_index;                            //接收数据下标

void USART1_Config(uint32_t baud); // 串口1配置（TX:PA9 	RX:PA10）
void usart1_send_str(char *s);     // 串口1发送字符串

void USART2_Config(uint32_t baud); // 串口3配置（TX:PB10 	RX:PB11）
void usart2_send_str(char *s);     // 串口3发送字符串

void USART3_Config(uint32_t baud); // 串口3配置（TX:PB10 	RX:PB11）
void usart3_send_str(char *s);     // 串口3发送字符串

int print_f(const char *fmt, ...);  // 格式化向串口1输出信息
int print_ln(const char *fmt, ...); // 格式化向串口1输出信息，并添加换行符

#endif
